#include <sys/stat.h>
// 获取文件大小
unsigned long get_file_size(const char *path)
{
    unsigned long filesize = -1;
    struct stat statbuff;
    if (stat(path, &statbuff) < 0)
    {
        return filesize;
    }
    else
    {
        filesize = statbuff.st_size;
    }
    return filesize;
}


#include "dirent.h"
/** 创建目录
 * @name: createDir
 * @param {char} *dir 目录名称
 * @returns {int} 0 创建成功 -1 创建失败，目录已存在
 */
int create_dir(char *dir)
{
    if (access(dir, F_OK) == -1) // 函数用来判断用户是否具有访问某个文件的权限(或判断某个文件是否存在).
                                 // F_OK 值为0，判断文件是否存在
                                 // X_OK 值为1，判断对文件是可执行权限
                                 // W_OK 值为2，判断对文件是否有写权限
                                 // R_OK 值为4，判断对文件是否有读权限
    {
        printf("create dir: %s\n", dir);

        mkdir(dir, 0777); // 创建目录
        return 0;
    }
    else
    {
        printf("%s dir exist\n", dir);
        return -1;
    }
}



/** 二进制转十进制
 * @param {char} *n 二进制字符串
 * @return {*}
 */
long bintodec(char *n)
{
    int a = 2;
    char *result;
    long ret = strtol(n, &result, a);
    return ret;
}

/** 十进制转二进制
 * @param {int} n 十进制数字
 * @return {*}
 */
int dectobin(int n)
{
    int sum = 0;
    int y, x = 1; // y表示余数，x为叠加的系数
    while (n != 0)
    {
        y = n % 2;
        sum += x * y;
        x *= 10;
        n /= 2;
    }
    return sum;
}

/** 获取时间戳函数
 * @description:
 * @return {long long} tmp 时间戳
 */
long long get_timestamp(void)
{
    long long tmp;
    struct timeval tv;

    gettimeofday(&tv, NULL);
    tmp = tv.tv_sec;
    tmp = tmp * 1000;
    tmp = tmp + (tv.tv_usec / 1000);

    return tmp;
}

/** 获取本地时间，精确到毫秒
 * @param {char} *str_time
 * @return {*}
 */
void get_format_time_ms(char *str_time)
{
    struct tm *tm_t;
    struct timeval time;

    if (sizeof(str_time) < 32)
    {
        printf("input buff len less than 32\n");
        return;
    }
    gettimeofday(&time, NULL);
    tm_t = localtime(&time.tv_sec);
    if (NULL != tm_t)
    {
        sprintf(str_time, "%04d-%02d-%02d %02d:%02d:%02d.%03ld",
                tm_t->tm_year + 1900,
                tm_t->tm_mon + 1,
                tm_t->tm_mday,
                tm_t->tm_hour,
                tm_t->tm_min,
                tm_t->tm_sec,
                time.tv_usec / 1000);
    }

    return;
}


/** 秒转换为时分秒
 * @name: sec2hms
 * @param {int} sec 要转换的秒数
 * @returns {*} 时分秒结构体
 */
operate_time_t sec2hms(int sec)
{
    operate_time_t operate_time;

    operate_time.hour = 0;
    operate_time.min = 0;
    operate_time.sec = 0;

    if (sec >= 3600)
    {
        operate_time.hour = sec / 3600;
        sec = sec % 3600;
    }
    if (sec >= 60)
    {
        operate_time.min = sec / 60;
        sec = sec % 60;
    }
    operate_time.sec = sec;

    return operate_time;
}

/** 根据日期计算星期几
 * @name: day2week
 * @param {int} year 年
 * @param {int} month 月
 * @param {int} day 日
 * @returns {int} 0-6分别代表星期日-星期六
 */
int date2week(int year, int month, int day)
{
    int T;
    if (month < 3)
    {
        month += 12;
        year -= 1;
    }
    // 基姆拉尔森计算公式
    T = ((day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400 + 1) % 7 + 7) % 7;
    return T;
}